package fr.jhaccoun.demenager_eco.web.utilisateur.produit;

import java.util.List;
import java.util.Locale;

import javax.validation.Valid;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.PropertyEditorRegistrar;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import fr.jhaccoun.demenager_eco.produit.Categorie;
import fr.jhaccoun.demenager_eco.produit.CategorieService;
import fr.jhaccoun.demenager_eco.produit.EtatUsure;
import fr.jhaccoun.demenager_eco.produit.EtatUsureService;
import fr.jhaccoun.demenager_eco.produit.Produit;
import fr.jhaccoun.demenager_eco.produit.ProduitService;
import fr.jhaccoun.demenager_eco.utilisateur.Utilisateur;
import fr.jhaccoun.demenager_eco.utilisateur.UtilisateurService;


@Controller
@RequestMapping(value = "/compte-utilisateur/mes-produits")
public class UserProductController {

	private static final Logger LOGGER = LoggerFactory.getLogger(UserProductController.class);

	//TODO Grouper tous les services relatifs au produit dans un autre service englobant afin d'avoir moins de service eparpillé et centraliser les infos OU trouver un moyen avec spring date d'avoir un service pour les différentes entités : EtatUsure, Categorie...
	
	@Autowired 
	private UtilisateurService userService;

	@Autowired 
	private EtatUsureService etatUsureService;

	@Autowired 
	private CategorieService categorieService;
	
	@Autowired 
	private ProduitService produitService;
	
	@Autowired
	private MessageSource messageSource;
  
	@RequestMapping(value = "/creation", method = RequestMethod.GET)
	public String initCreatePage(Model model) { 
		LOGGER.info("Initialisation de la création de produit");
		initModel(model,new Produit());
		return getBuildedUrlPourCompteUtilisateurMesProduits("creation-produit"); 
	}

	@RequestMapping(value = "/creation", method = RequestMethod.POST)
	public String createProduit(@Valid @ModelAttribute("produitForm") Produit produit, BindingResult bresult,RedirectAttributes redirectAttributes,Model model) { 
		LOGGER.info("Création du produit, produit:{}",produit);

		if (bresult.hasErrors()) {
			LOGGER.info("Erreur détecté lors de la validation du produit"); 
			model.addAttribute("produitForm",produit); 
			return getBuildedUrlPourCompteUtilisateurMesProduits("creation-produit");     
		}
		
		Utilisateur user = userService.getUtilisateurById(userService.getCurrentUser().getId());  

//		LOGGER.info("Ajout du produit {} à l'utilisateur {}",produit,user);
//		user.addProduit(produit);
//		
//		LOGGER.info("Mise à jour de l'utilisateur {}",user);
//		userService.updateUtilisateur(user);
		produit.setUtilisateur(user);
		produitService.addProduit(produit);
		
		redirectAttributes.addFlashAttribute("confirmationCreationProduit", messageSource.getMessage("produit.creation.succes.descriptionContenu",null,Locale.getDefault()));
		  
		return "redirect:/compte-utilisateur/mes-produits/creation-succes";
	}  
	
	@RequestMapping(value = "/creation-succes", method = RequestMethod.GET)
	public String createUserSucces(Model model){
		LOGGER.info("Affichage page creation produit reussi"); 
		return getBuildedUrlPourCompteUtilisateurMesProduits("creation-produit-succes");  
	}

	private void initModel(Model model, Produit produit){
		model.addAttribute("produitForm",produit);
	}

	private String getBuildedUrlPourCompteUtilisateurMesProduits(String specificPage){
		return "front.compte-utilisateur.mes-produits."+specificPage;
	}


	@ModelAttribute("etatUsureList")
	public List<EtatUsure> getEtatsUsure() {
		return etatUsureService.getAllEtatUsure();
	}

	@ModelAttribute("categorieList")
	public List<Categorie> getCategories() {
		return categorieService.getAllCategories();
	}

}
